# 元类

class A:

    def fun1(self):
        print('a,fun1.......')


# 对象是由类创建的
a = A()

# 问题来了, 类是由谁创建的

# 看一个对象是什么类型,就是看它是由谁创建的
print(type(a))  # <class '__main__.A'>
# --> a 是由A创建的对象
print(type(A))  # <class 'type'>
# --> A 是由type创建的

# type(object) -> the object's type  通常咱们用的是这个方法
# 今天咱们来学习type的另外一个用法 type(name, bases, dict) -> a new type

# 三个参数,类的名字,字符串;  元组(这个类的父类们); 字典(这个类的属性和方法)
B = type('B', (), {})  # 元类

b = B()
print(type(B))
print(type(b))


# 元类 --> 数据库的orm

def fun2(self):
    print('c,fun2.......')


C = type('C', (A,), {'name': 'zhangsan', 'fun2': fun2})

c = C()
c.fun1()

print(C.name)

print(c.fun2())

# __class__ 属性和type 一样
print(type(a))
print(a.__class__)

print(type(A))
print(A.__class__)

# 元类是由谁创建的
print(type.__class__)